package com.gitee.huanminabc.utils_common.base;

import com.gitee.huanminabc.jcommon.str.StringUtil;

import java.util.Collection;
import java.util.Map;
import java.util.function.Supplier;

/**
 * 判断各种类型是否为空
 * @author 胡安民
 * @Description:  判断是否为空的工具栏
 *
 */
public class NullUtil {


    //判断不等于空并且如果是字符串类型那么也不能是空
    public static  boolean is(Object o){
        if (o==null){
            return true;
        }
        if (o instanceof  String && StringUtil.isEmpty((String) o) ){
            return true;
        }
        if (o instanceof Collection && ((Collection<?>) o).isEmpty()){
            return true;
        }
        //如果是map或者list那么判断是否为空
        if (o instanceof Map && ((Map<?, ?>) o).isEmpty()){
            return true;
        }
        if (o instanceof Object[] && ((Object[]) o).length==0){
            return true;
        }
        return false;
    }
    //只要有一个为空就返回true
    public static  boolean isAny( Object ...o){
        for (Object o1 : o) {
            if (is(o1)){
                return true;
            }
        }
        return false;
    }
    //全部为空返回true,只要有一个不为空就返回false
    public static  boolean is(Object ...o){
        for (Object o1 : o) {
            if (!is(o1)){
                return false;
            }
        }
        return true;
    }

    //判断不是空返回true
    public static  boolean non(Object o){
        return !is(o);
    }
    //全部不为空返回true,只要有一个为空就返回false
    public static  boolean non(Object ...o){
        for (Object o1 : o) {
            if (is(o1)){
                return false;
            }
        }
        return true;
    }

    //判断对象是否为空,如果为空返回默认值
    public static <T> T orElse(T obj, T defaultValue) {
        return is(obj) ? defaultValue : obj;
    }

    public static <T> T orElse(T obj, Supplier<T> defaultValue) {
        return is(obj) ? defaultValue.get() : obj;
    }

    public static <T,X extends Throwable> T orThrow(T obj, Supplier<? extends X> exceptionSupplier) throws X {
        if (is(obj)){
            throw exceptionSupplier.get();
        }
        return obj;
    }


}